#include <DagMtx.h>
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
using namespace std;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
template < typename node_t > U64  DagMtx< node_t >::TotalNodeCountByStats( void ) const {
   
   U64 totalNodeCount = 0ULL;
   
   for( U32 dagIdx = 0; dagIdx < dagStats.size(); dagIdx++ ) {

      totalNodeCount += dagStats[ dagIdx ].TotalNodeCount();
   }
   return totalNodeCount;
}
template < typename node_t > void DagMtx< node_t >::CalculateLogicallyDenseArrStats( void ) {
   
   ArrStatistics stats;
   
   stats.numElems = 1*meta.nnz + 1*meta.nnz + 1*meta.m + 1;
   stats.numBytes = 8*meta.nnz + 4*meta.nnz + 4*meta.m + 4;
   
   arrStats.push_back( stats );
   dagNames.push_back( "LogicallyDense" );
   arrNames.push_back( "NonZerosAndIndices" );
}
template < typename node_t > void DagMtx< node_t >::CalculateHybridArrStats( void ) {
   
   ArrStatistics nnzStats;
   ArrStatistics idxStats;
   
   nnzStats.numElems = 1*meta.nnz;
   nnzStats.numBytes = 8*meta.nnz;
   idxStats.numElems = 1*meta.nnz + 1*meta.m + 1;
   idxStats.numBytes = 4*meta.nnz + 4*meta.m + 4;
   
   arrStats.push_back( nnzStats );
   arrStats.push_back( idxStats );
   
   dagNames.push_back( "nnzList" );
   arrNames.push_back( "nnzList" );
   dagNames.push_back( "pattMtx" );
   arrNames.push_back( "colIdxsAndRowPtrs" );
}
template < typename node_t > void DagMtx< node_t >::CalculateCompressedArrStats( void ) {
   
   ArrStatistics nnzStats;
   ArrStatistics idxStats;
   ArrStatistics ptrStats;
   
   nnzStats.numElems = 1*meta.nnz;
   nnzStats.numBytes = 8*meta.nnz;
   idxStats.numElems = 1*meta.nnz;
   idxStats.numBytes = 4*meta.nnz;
   ptrStats.numElems = 1*meta.m + 1;
   ptrStats.numBytes = 4*meta.m + 4;
   
   arrStats.push_back( nnzStats );
   arrStats.push_back( idxStats );
   arrStats.push_back( ptrStats );
   dagNames.push_back( "nnzList" );
   arrNames.push_back( "nnzList" );
   dagNames.push_back( "colIdxs" );
   arrNames.push_back( "colIdxs" );
   dagNames.push_back( "rowPtrs" );
   arrNames.push_back( "rowPtrs" );
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// force instantiation of necessary code:
template class DagMtx< BNode >;
template class DagMtx< QNode >;
template class DagMtx< ONode >;
